package com.usian.user.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.usian.common.contants.user.AdminConstans;
import com.usian.common.exception.CatchCustomException;
import com.usian.common.exception.code.UserStatusCode;
import com.usian.model.article.pojos.ApAuthor;
import com.usian.model.common.dtos.ResponseResult;
import com.usian.model.common.enums.AppHttpCodeEnum;
import com.usian.model.media.pojos.WmUser;
import com.usian.model.user.dtos.AuthDto;
import com.usian.model.user.pojos.ApUser;
import com.usian.model.user.pojos.ApUserIdentity;
import com.usian.model.user.pojos.ApUserRealname;
import com.usian.user.feign.ArticleFeign;
import com.usian.user.feign.WemediaFeign;
import com.usian.user.mapper.ApUserIdentityMapper;
import com.usian.user.mapper.ApUserMapper;
import com.usian.user.mapper.ApUserRealnameMapper;
import com.usian.user.service.ApUserIdentityService;
//import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
@SuppressWarnings("ALL")
public class ApUserIdentityServiceImpl extends ServiceImpl<ApUserIdentityMapper, ApUserIdentity> implements ApUserIdentityService {

    @Autowired
    private ApUserRealnameMapper apUserRealnameMapper;
    @Autowired
    private ApUserIdentityMapper apUserIdentityMapper;
    @Autowired
    private WemediaFeign wemediaFeign;
    @Autowired
    private ArticleFeign articleFeign;
    @Autowired
    private ApUserMapper apUserMapper;
    //实名认证成功之后，进行身份认证
    /**
     * 身份认证
     * @GlobalTransactional  全局事务处理  但有时候解决不了本地事务  可以在使用本地事务
     * Transactional
     * @param dto
     * @param status
     * @return
     */

    @Override
    @Transactional
//    @GlobalTransactional
    public ResponseResult updateStatus(AuthDto dto, Short status) {
        //检查参数
        if (dto==null || dto.getId()==null){
            CatchCustomException.catchs(UserStatusCode.PARAM_FAIL,"参数非法");
        }
        //通过认证id，获取身份表对象
        ApUserIdentity apUserIdentity = apUserIdentityMapper.selectById(dto.getId());
        //获取身份证里面的userid对应的realname表对象
        ApUserRealname apUserRealname=apUserRealnameMapper.findUserId(apUserIdentity.getUserId());
        //判断对象实名认证状态  如果不等于9 则提醒用户进行实名认证
        if (apUserRealname.getStatus()!=9){
            CatchCustomException.catchs(UserStatusCode.PARAM_FAIL,"请先进行实名认证");
        }
        //修改身份认证的状态：1、如果有驳回信息，执行驳回方法
        if (dto.getMsg() != null){
            apUserIdentity.setStatus(status);
            apUserIdentity.setReason(dto.getMsg());
            apUserIdentityMapper.updateById(apUserIdentity);
            return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
        }
        //没有驳回信息时
        //修改用户认证身份的状态
        apUserIdentity.setStatus(status);
        apUserIdentityMapper.updateById(apUserIdentity);
        //判断用户的状态是否等于9（PASS_AUTH）
        if (status.equals(AdminConstans.PASS_AUTH)){
            //如果等于  判断身份证id是否有自媒体账号（在ap_user表中wm_user_id）信息、
            if (createWmUserAndAuthor(apUserIdentity.getUserId())!=null){
                CatchCustomException.catchs(UserStatusCode.PARAM_FAIL,"自媒体账号或作者账号错误");
            }
        }
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 创建自媒体账号
     * @param id  user_id
     * @return
     */
    private ResponseResult createWmUserAndAuthor(Integer id) {
        //先跟据身份证的id  查询对象  获取对象中的user_id
        if (id == null) {
            CatchCustomException.catchs(UserStatusCode.PARAM_FAIL, "参数非法");
        }
        //通过id获取user信息
        ApUser apUser = apUserMapper.selectById(id);
        //查询user对象--->因为创建自媒体账号的时候  需要吧user对象中的信息  同步到wemedia_user中
        if (apUser == null) {
            CatchCustomException.catchs(UserStatusCode.PARAM_FAIL, "参数非法");
        }
//        //判断当前账号是否已经存在  ap_user中的name与wm_user中的name相同
        WmUser user = wemediaFeign.findByName(apUser.getName());
        if (user == null) {
             user = new WmUser();
            user.setApUserId(apUser.getId());
            user.setCreatedTime(new Date());
            user.setSalt("无");
            user.setName(apUser.getName());//生成的登录用户名
            user.setPassword(apUser.getPassword());//生成的登录密码
            user.setStatus(9);//账号状态
            user.setType(0);//账号类型
            user.setPhone(apUser.getPhone());//手机号
            wemediaFeign.save(user);
        }
        //创建作者账号
        createAuthor(user);
        apUser.setFlag((short) 1);//1 为自媒体人
        apUserMapper.updateById(apUser);
    return null;
    }

    /**
     * 创建作者
     * @param wmUser
     */
    public void createAuthor(WmUser wmUser){
        //只能有了自媒体账号才能有作者
        Integer apUserId = wmUser.getApUserId();//得到ap_user的id
        Integer id = wmUser.getId();//得到wm_user的id
        //调用远程接口根据userID查询作者对象，如果没有进行前端赋值
        ApAuthor apAuthor=articleFeign.findByUserId(apUserId);
        if (apAuthor==null){
            apAuthor=new ApAuthor();
            apAuthor.setUserId(apUserId);
            apAuthor.setWmUserId(id);
            apAuthor.setName(wmUser.getName());
            apAuthor.setType(Integer.valueOf(AdminConstans.AUTHOR_TYPE));//自媒体人类型
            articleFeign.save(apAuthor);
        }
    }


}
